import math
import pandas as pd
import json
from matplotlib import path
import numpy as np
h_filename='BVG/batch_result_20170710/haltestellen_20170710.csv'
hdf=pd.read_csv(h_filename,sep=';',encoding = "ISO-8859-1")
hdf.columns=['H','lon','lat','location']
dictH={}
for row in hdf.itertuples(index=True):
dictH[row.location]={'lon':row.lon,'lat':row.lat}
stations=dictH.keys()
q_filename='BVG/batch_result_20170710/anfragen_20170710.csv'
qdf=pd.read_csv(q_filename,sep=';',encoding = "ISO-8859-1")
a=qdf[['ANFRAGE_ID','START_NAME','START_X','START_Y']]
b=qdf[['ANFRAGE_ID','ZIEL_NAME','ZIEL_X','ZIEL_Y']]
columns=['PathID','location','lon','lat']
a.columns=columns
b.columns=columns
df=pd.concat([a,b])
lonL=[]
latL=[]
stations=dictH.keys()
cnt1=0
cnt2=0
for row in df.itertuples(index=True):
index=row.Index
if math.isnan(row.lon):
cnt1+=1
if row.location in stations:
lonL.append(dictH[row.location]['lon'])
latL.append(dictH[row.location]['lat'])
else:
cnt2+=1
lonL.append(float('nan'))
latL.append(float('nan'))
else:
lonL.append(row.lon)
latL.append(row.lat)
df['lon']=lonL
df['lat']=latL
df.dropna(inplace=True)
geoData=json.load(open('bezirksgrenzen.geojson'))
regionsPDict={}
for i in range(len(geoData['features'])):
tmpDf=pd.DataFrame(data=geoData['features'][i]['geometry']['coordinates'][0][0],columns=['lon','lat'])
region_id=int(geoData['features'][i]['properties']['Gemeinde_schluessel'])
tmpDf['region_id']=region_id
tmpDf['region_name']=geoData['features'][i]['properties']['Gemeinde_name']
if i==0:
regionsDF=tmpDf
else:
regionsDF=pd.concat([regionsDF,tmpDf])
regionsPDict[region_id]=path.Path(geoData['features'][i]['geometry']['coordinates'][0][0])
#df[regionsPDict[1].contains_points(df[['lon','lat']])]
dfDict={}
regionsList=np.arange(1,13)
connectivityG=np.zeros(shape=(len(regionsList),len(regionsList)),dtype=int)
for r1ID in regionsList:
dfDict[r1ID]={}
for r2ID in regionsList:
if r2ID>=r1ID:
print('Region pairs:',r1ID,r2ID)
s1=set(df[regionsPDict[r1ID].contains_points(df[['lon','lat']])].PathID)
s2=set(df[regionsPDict[r2ID].contains_points(df[['lon','lat']])].PathID)
s=s1&s2
connectivityG[r1ID-1,r2ID-1]+=len(s)
dfDict[r1ID][r2ID]=df[df['PathID'].isin(s)]
print(connectivityG)
for i in range(connectivityG.shape[0]):
for j in range(i+1,connectivityG.shape[0]):
connectivityG[j,i]=connectivityG[i,j]
regions=regionsDF.groupby('region_id').mean()
conArgSort=connectivityG.argsort(axis=1)
graphD={i+1:row[-3:-1]+1 for i,row in enumerate(conArgSort)}
graphV={i+1:connectivityG[i,row[-3:-1]] for i,row in enumerate(conArgSort)}
maxEdge=max([max(graphV[k]) for k in graphD.keys()])
minEdge=min([min(graphV[k]) for k in graphD.keys() if k!=3])
scaleD=maxEdge-minEdge
lineL={}
for i in range(1,13):
lineL[i]=[]
for k,j in enumerate(graphD[i]):
lineL[i].append([[regions.loc[i,'lon'],regions.loc[j,'lon']],
[regions.loc[i,'lat'],regions.loc[j,'lat']],
(graphV[i][k]-minEdge)/scaleD])
#print(i,k,j,(graphV[i][k]-minEdge)/scaleD)
import plotly.graph_objects as go
import plotly.io as pio
mapbox_access_token="pk.eyJ1IjoibWRraGF0YW1pIiwiYSI6ImNqc2Q3MDBlZzBjdTYzeXRsbmtuN2JmYTAifQ.DmiQnVUdDKAV2G2uZppE3g"
lat=regionsDF.lat.mean()
lon=regionsDF.lon.mean()
jelbiArr=[[52.499258, 13.407773],
[52.554145, 13.416526],
[52.544389, 13.295859],
[52.529869, 13.449394],
[52.453640, 13.385650]]
jelbi=pd.DataFrame(jelbiArr,columns=['lat','lon'])
fig = go.Figure()
fig.add_trace(go.Scattermapbox(
lat=regionsDF['lat'],
lon=regionsDF['lon'],
text=regionsDF['region_id'],
mode='markers',
marker=go.scattermapbox.Marker(size=3),
name='df2'))
fig.add_trace(go.Scattermapbox(
lat=regions['lat'],
lon=regions['lon'],
mode='markers',
marker=go.scattermapbox.Marker(size=10),
name='df2'))
fig.add_trace(go.Scattermapbox(
lat=jelbi['lat'],
lon=jelbi['lon'],
mode='markers',
marker=go.scattermapbox.Marker(size=10),
name='df2'))
for i in range(1,13):
if i!=3:
for k in [0,1]:
if lineL[i][k][2]<0.4:
linewidth=2
elif lineL[i][k][2]<0.6:
linewidth=4
else:
linewidth=6
fig.add_trace(go.Scattermapbox(
mode = "lines",
lon = lineL[i][k][0],
lat = lineL[i][k][1],
line=dict(color='red',width=linewidth)))
fig.update_layout(
showlegend=False,
hovermode='closest',
dragmode='zoom',
height=1500,
mapbox=go.layout.Mapbox(
accesstoken=mapbox_access_token,
bearing=0,
center=go.layout.mapbox.Center(
lat=lat,
lon=lon
),
pitch=0,
zoom=10
)
)
fig.show()